home *** CD-ROM | disk | FTP | other *** search
/ Delphi Programmer's Power Pack / Delphi Volume 1.iso / e_to_l / fbuilder / delphi / fbcalc.pa1 < prev    next >
Text File  |  1996-09-15  |  26KB  |  720 lines

  1. {
  2. //  FORMULABUILDER 1.0
  3. //  YGB Software, Inc.
  4. //  An Advanced Expression Evaluation Engine
  5. //  Copyright 1995 Clayton Collie, All Rights Reserved
  6. //
  7. //  Pascal Import unit for Formula Builder DLL
  8. //  Explicit Linking Version
  9. //
  10. //
  11. // NOTE! Included for informational purposes only ! DO NOT modify and
  12. // recompile, as this will cause a unit version mismatch error in the
  13. // component units.
  14. }
  15.  
  16. unit fbcalc;
  17. INTERFACE
  18. Uses Wintypes;
  19. CONST
  20.   FBuilderLib = 'FBCALC.DLL';
  21.  
  22. TYPE
  23.   Float      = Double;
  24.   TFBString  = PString;
  25.   {$IFDEF VER80}
  26.   TFBDate    = TDateTime;
  27.   {$ELSE}
  28.   TFBDate    = Double;
  29.   {$ENDIF}
  30.    HEXPR     = Longint;   { expression handle type }
  31.  
  32. CONST
  33.  
  34.    MAXFUNCPARAMS = 16;  { Functions can have up to MAXFUNCPARAMS parameters }
  35.  
  36.  
  37.   {::::::::::::::::::: Variable/Datatype constants:::::::::::::::::::::: }
  38.   { vtInteger .. vtClass taken from  \delphi\doc\system.int}
  39.  
  40.     vtINTEGER      = 0;
  41.     vtBOOLEAN      = 1;
  42.     vtCHAR         = 2;
  43.     vtFLOAT        = 3;
  44.     vtSTRING       = 4;
  45.     vtPOINTER      = 5;
  46.     vtPCHAR        = 6; { unused }
  47.     vtDATE         = 9;
  48.     vtBOOL         = 10;
  49.     vtANY          = 11;
  50.     vtNONE         = 13;
  51.     vtTypeClash    = 14;
  52.     vtTypeMismatch = vtTypeClash;
  53.  
  54. CONST
  55.     BOOLTRUE   = WORD(1);
  56.     BOOLFALSE  = WORD(0);
  57.  
  58. type
  59.     datatypes   = vtInteger .. vtNone;
  60.     datatypeset = set of Datatypes;
  61.  
  62. CONST
  63.       EXPR_SUCCESS                 =     1;
  64.       EXPR_MISSING_PAREN           =     2;
  65.       EXPR_BAD_EXPRESSION          =     3;
  66.       EXPR_BAD_ASSIGNMENT          =     4;
  67.       EXPR_UNKNOWN_IDENT           =     5;
  68.       EXPR_LINE_TOO_LONG           =     6;
  69.       EXPR_INVALID_TOKEN           =     7;
  70.       EXPR_INVALID_CHAR            =     8;
  71.       EXPR_MISSING_PARAM           =     9;
  72.       EXPR_TYPE_MISMATCH           =     10;
  73.       EXPR_INVALID_NUMBER          =     11;
  74.       EXPR_MISSING_VARIABLE        =     12;
  75.       EXPR_INVALID_VARIABLE        =     EXPR_MISSING_VARIABLE;  {CC}
  76.       EXPR_INVALID_FUNCTION        =     13;
  77.       EXPR_ZERO_DIVISION           =     14;
  78.       EXPR_STACK_OVERFLOW          =     15;
  79.       EXPR_UNEXPECTED_EOS          =     16;
  80.       EXPR_INVALID_DATE            =     17;
  81.       EXPR_IDENTIFIER_EXPECTED     =     18;
  82.       EXPR_RANGE_ERROR             =     19;
  83.       EXPR_DOMAIN_ERROR            =     20;
  84.       EXPR_MATH_ERROR              =     21;
  85.       EXPR_FP_OVERFLOW             =     22;
  86.       EXPR_FP_UNDERFLOW            =     23;
  87.       EXPR_INT_OVERFLOW            =     24;
  88.       EXPR_INVALID_OP              =     25;
  89.       EXPR_VARIABLE_EXPECTED       =     26;
  90.       EXPR_MISSING_OPERATOR        =     27;
  91.       EXPR_MISSING_OPERAND         =     28;
  92.       EXPR_CONSTANT_EXPECTED       =     29;
  93.       EXPR_DUPLICATE_IDENT         =     30;
  94.       EXPR_SYNTAX_ERROR            =     31;
  95.       EXPR_CONVERT_ERROR           =     32;
  96.       EXPR_INVALID_TYPE            =     33;
  97.       EXPR_INVALID_HANDLE          =     50;
  98.       EXPR_INVALID_CALLBACK        =     51;
  99.       EXPR_FORMULA_TOO_COMPLEX     =     54;
  100.  
  101.  
  102.  
  103. Const IDI_MAIN  = 1;
  104.       IDS_TRUE  = 2;
  105.       IDS_FALSE = 3;
  106.  
  107.  
  108. TYPE
  109. { General value structure }
  110.  
  111.  PValueRec = ^TValueRec;
  112.  TValueRec = record
  113.      flags : byte;
  114.      case vtype  : datatypes of
  115.        vtInteger : (vInteger    : Longint);
  116.        vtString  : (vpString    : TFBString);
  117.        vtBoolean : (vBoolean    : Boolean);
  118.        vtChar    : (vChar       : Char);
  119.        vtFloat   : (vFloat      : Float);
  120.        vtPChar   : (vpChar      : PChar);
  121.        vtPointer : (vPointer    : Pointer);
  122.        vtDate    : (vDate       : TFBDate);
  123.        vtBOOL    : (vBOOL       : BOOL);
  124.   end;
  125.  
  126.  
  127. {
  128.  // Callback definitions for variable & field implementation
  129. }
  130.  
  131. TYPE
  132.  TCBKGetVariable =
  133.    function(varname   : pchar;
  134.             var value : TValueRec;
  135.             vardata   : longint;
  136.             CBKData   : longint):integer;
  137.  
  138.  TCBKSetVariable =
  139.    function(varname : pchar;
  140.             value   : TValueRec;
  141.             vardata : longint;
  142.             CBKData : longint):integer;
  143.  
  144.  TCBKFindvariable =
  145.    function(varname      : pchar;
  146.             var vtype    : byte;
  147.             var VarData  : longint;
  148.             CBKData      : longint):integer;
  149.  
  150.  { function enumeration Callback }
  151.  
  152.  TCBKEnumFunctions =
  153.    function(vname : pchar;vtype : byte;parms : pchar;bMinPrms : byte;lEnumData : longint):integer;
  154.  
  155. {******************************************************
  156.  *  Declarations for external function implementation
  157.  ******************************************************}
  158.  
  159.  
  160. {
  161.  // Actual parameter list passed to external function callback
  162.  // The parser engine ensures that these match, in number and
  163.  // type, the prototype specified when the callback was registered
  164. }
  165.  
  166.  PActParamlist = ^TActParamlist;
  167.  TActParamList = array[0..MAXFUNCPARAMS-1] of TValueRec;
  168.  
  169.  
  170.  {
  171.  // Prototypes for external user-defined functions
  172.  // Implemented routine MUST use the EXPORT clause
  173.  }
  174.  
  175.   TCBKExternalFunc =
  176.      procedure(paramcount      : byte;
  177.                const params    : TActParamlist;
  178.                var   retvalue  : TValueRec;
  179.                var   errcode   : integer;
  180.                ExprData        : longint);
  181.      
  182. var
  183. {
  184. //
  185. //  Functions and Procedures
  186. //
  187. }
  188.  
  189.  {*----------------------------------------------*}
  190.  { Engine initialization and shutdown             }
  191.  {*----------------------------------------------*}
  192.  
  193.   FBInitExpression : Function(lExprData : longint) : longint;
  194.   FBFreeExpression : Function(handle : HEXPR)      : integer;
  195.  
  196.  
  197.  {::::::::::::::::::::: Expression Manipulation ::::::::::::::::::::}
  198.  
  199.   FBSetExpression     : Function(handle : HEXPR;expr : pchar):integer;
  200.   FBReparseExpression : Function(handle : HEXPR):integer;
  201.   FBClearExpression   : Function(handle : HEXPR) : integer;
  202.   FBGetExpression     : Function(handle : HEXPR;lpszBuf : pchar;wBuflen : word):integer;
  203.  
  204.  {::::::::::::::::::::: Expression Evaluation :::::::::::::::::::::::}
  205.  
  206.   { determine the result type of the expression. Returns one of the }
  207.   { vtXXX constants, vtTYPEMISMATCH for an invalid expression       }
  208.  
  209.   FBGetReturnType : Function(handle : HEXPR) : integer;
  210.  
  211. {
  212.  //  Evaluate the expression, returning a maximum of maxlen characters
  213.  // of the null-terminated string result in the buffer/string pointed to
  214.  //  by outbuf
  215. }
  216.  
  217.   FBEvaluate    : Function(handle : HEXPR;lpszBuf : pchar;wBuflen : word):integer;
  218.  
  219.  {*
  220.   * Evaluate the expression, returning the result in a TValueRec structure
  221.   * FBFreevalue should be used to dispose of any memory associated with value
  222.   * when it is no longer needed
  223.   *}
  224.  
  225.   FBEvaluatePrim : Function(handle : HEXPR;var value : TVALUEREC):integer;
  226.  
  227.  
  228.  {*  Dispose of any memory associated with a TValueRec structure *}
  229.  
  230.   FBFreeValue : Procedure(var Value : TValueRec);
  231.  
  232.  
  233.   FBCopyValue : Function(value : TValueRec):TValueRec;
  234.  
  235.  {*
  236.   *  Routines to get the expression results in primitive types
  237.   *}
  238.  
  239.   FBGetStringResult  : Function(handle : HEXPR;value : pchar;maxlen : word):integer;
  240.   FBGetFloatResult   : Function(handle : HEXPR;var value : double):integer;
  241.   FBGetBooleanResult : Function(handle : HEXPR;var value : BOOL):integer;
  242.   FBGetIntegerResult : Function(handle : HEXPR;var value : longint):integer;
  243.   FBGetDateResult    : Function(handle : HEXPR;var value : TFBDate):integer;
  244.  
  245.  {*======================================================================*}
  246.  { Perform a single operation expression evaluation. This is not the most  }
  247.  { efficient method of evaluation when the expression remains the same    }
  248.  {*======================================================================*}
  249.  
  250.   FBEvalExpression : Function(expr : pchar;var retType : datatypes;
  251.                               buf  : pchar;maxlen      : word):integer;
  252.  
  253.  {::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
  254.  { Internal Variable handling routines. NOTE ! If the variable callbacks are }
  255.  { implemented, the evaluation engine will not see the var